﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.html;
using iTextSharp.text.pdf;
using System.Collections;
using nmVentas;
using nmConnectionDatabase;
using System.Windows.Forms;
using System.Diagnostics;


namespace nmFactura
{
    public class Factura
    {
        ConexionDB Conexion;
        Ventas objVentas;  
        string nombreCliente;
        string nombreVendedor;

        public Factura()
        {
        }

        public Factura(string numFactura, ConexionDB dbConexion)
        {

            objVentas = new Ventas();
            Conexion = new ConexionDB();
            this.Conexion = dbConexion;
            objVentas.setNumFactura(numFactura);
            CargarDatosFactura();
            CargarDatosCliente();
            CargarDatosVendedor();
        }

        public void CargarDatosFactura()
        {
            string consultaSQL = @"Select * FROM Ventas WHERE NumFactura = '" + objVentas.getNumFactura() + "'";
            Conexion.CargarDataSet(consultaSQL, "Ventas");
            objVentas.setDNICliente(Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[1].ToString());
            objVentas.setIDUsuario(Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[2].ToString());
            objVentas.setFecha(DateTime.Parse(Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[3].ToString()));
            objVentas.setImporte(float.Parse(Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[4].ToString()));
            objVentas.setFormaPago(Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[5].ToString());
        }

        private void CargarDatosCliente()
        {
            string consultaSQL = @"Select Nombre + ' ' + Apellido FROM Usuarios WHERE IDUsuario = '" + objVentas.getIDUusario() +"'";
            Conexion.CargarDataSet(consultaSQL, "Usuarios");
            nombreVendedor = Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[0].ToString();
        }

        private void CargarDatosVendedor()
        {
            string consultaSQL = @"Select Nombre + ' ' + Apellido FROM Clientes WHERE DNI = '" + objVentas.getDNICliente() +"'";
            Conexion.CargarDataSet(consultaSQL, "Clientes");
            try { nombreCliente = Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[0].ToString(); }
            catch { nombreCliente = ""; }
            if (nombreCliente == "No Registrado No Registrado") nombreCliente = "No Registrado";
        }
      
        public void GenerarFactura()
        {
            if(!(Directory.Exists("facturas"))) Directory.CreateDirectory("facturas");
            Document factura = new Document(PageSize.A4, 1f,1f, 40f, 20f);
            PdfWriter.GetInstance(factura, new FileStream("facturas/" + objVentas.getNumFactura() + ".pdf", FileMode.Create));
            factura.Open();
            GenerarEncabezadoFactura(ref factura);
            GenerarProductosFactura(ref factura);
            GenerarTotalFactura(ref factura);
            factura.Close();
        }

        public void GenerarEncabezadoFactura(ref Document factura)
        {
            Rectangle page = factura.PageSize;
            Font Verdana = FontFactory.GetFont("Verdana", 10F, Font.NORMAL, BaseColor.BLACK);
            Font Verdana20 = FontFactory.GetFont("Verdana", 15F, Font.NORMAL, BaseColor.BLACK);
            PdfPTable table = new PdfPTable(2);
            table.TotalWidth = page.Width;
            PdfPCell cell = new PdfPCell();
            cell.Colspan = 3;
            cell.HorizontalAlignment = 0; //0=Left, 1=Centre, 2=Right
            System.Drawing.Image logoPNG = System.Drawing.Image.FromHbitmap(DarkPassenger.Properties.Resources._void.GetHbitmap());
            iTextSharp.text.Image logoPDF = iTextSharp.text.Image.GetInstance(logoPNG, System.Drawing.Imaging.ImageFormat.Png);
            AddImageInCell(cell, logoPDF, 200f, 200f, 0);
            cell.Border = 0;
            AddtextCell(table, cell, 0, 0, 0);
            PdfPCell cell2 = new PdfPCell();
            PdfPTable table2 = new PdfPTable(1);
            PdfPCell linea = new PdfPCell(new Phrase(" ",Verdana));
            PdfPCell line_1 = new PdfPCell(new Phrase("FACTURA:       A" + objVentas.getNumFactura() + Environment.NewLine, Verdana20));
            AddtextCell(table2, line_1, 0, 0, 0);
            PdfPCell line_2 = new PdfPCell(new Phrase("Email:       void@frgp.utn.edu.ar", Verdana));
            AddtextCell(table2, line_2, 0, 0, 0);
            PdfPCell line_3 = new PdfPCell(new Phrase("Telefono:  4740-5040", Verdana));
            AddtextCell(table2, line_3, 0, 0, 0);
            PdfPCell line_4 = new PdfPCell(new Phrase("Dirección: Yrigoyen 288, Gral. Pacheco", Verdana));
            AddtextCell(table2, line_4, 0, 0, 0);
            AddtextCell(table2, linea, 0, 0, 0);
            PdfPCell line_5 = new PdfPCell(new Phrase("CLIENTE: " + nombreCliente, Verdana));
            AddtextCell(table2, line_5, 0, 0, 0);
            PdfPCell line_6 = new PdfPCell(new Phrase("DNI: " + objVentas.getDNICliente(), Verdana));
            AddtextCell(table2, line_6, 0, 0, 0);
            AddtextCell(table2, linea, 0, 0, 0);
            PdfPCell line_7 = new PdfPCell(new Phrase("VENDEDOR: " + nombreVendedor, Verdana));
            AddtextCell(table2, line_7, 0, 0, 0);
            cell2.AddElement(table2);
            cell2.Border = 0;
            AddtextCell(table, cell2, 0, 0, 0);
            factura.Add(table);
        }

        public void GenerarProductosFactura(ref Document factura)
        {
            int cantRows;
            Rectangle page = factura.PageSize;
            string consultaSQL = @"SELECT Cantidad, Productos.Nombre,Precio FROM ArticulosXVenta 
                                   INNER JOIN Productos ON ArticulosXVenta.TipoProducto + ArticulosXVenta.IDProducto = 
                                   Productos.TipoProducto + Productos.IDProducto 
                                   WHERE NumFactura = '" + objVentas.getNumFactura() + "'";
            Conexion.CargarDataSet(consultaSQL, "ArticulosXVenta");
            cantRows = Conexion.GetDataSet().Tables[0].Rows.Count;
            PdfPTable table = new PdfPTable(4);
            table.TotalWidth = page.Width;
            float[] widths = new float[] { 1f, 3f, 1f, 1f };
            table.SetWidths(widths);
            PdfPCell cell = new PdfPCell();
            cell.Colspan = 4;
            cell.HorizontalAlignment = 0; //0=Left, 1=Centre, 2=Right
            table.AddCell(cell);
            table.AddCell("CANTIDAD");
            table.AddCell("CONCEPTO");
            table.AddCell("PRECIO");
            table.AddCell("TOTAL");
            for (int i = 0; i < cantRows; i++)
            {
                decimal cantidad = 0;
                decimal pu = 0;
                table.AddCell(Conexion.GetDataSet().Tables[0].Rows[i].ItemArray[0].ToString());
                table.AddCell(Conexion.GetDataSet().Tables[0].Rows[i].ItemArray[1].ToString());
                table.AddCell(Conexion.GetDataSet().Tables[0].Rows[i].ItemArray[2].ToString());
                decimal.TryParse(Conexion.GetDataSet().Tables[0].Rows[i].ItemArray[0].ToString(), out cantidad);
                decimal.TryParse(Conexion.GetDataSet().Tables[0].Rows[i].ItemArray[2].ToString(), out pu);
                table.AddCell((cantidad * pu).ToString());

            }
            factura.Add(table);
        }

        public void GenerarTotalFactura(ref Document factura)
        {
            decimal total = 0;
            string consultaSQL = @"SELECT ImporteFinal FROM Ventas
                                   WHERE NumFactura = '" + objVentas.getNumFactura() + "'";
            Conexion.CargarDataSet(consultaSQL, "Ventas");
            decimal.TryParse(Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[0].ToString(),out total);
            Rectangle page = factura.PageSize;
            PdfPTable table = new PdfPTable(3);
            table.TotalWidth = page.Width;
            float[] widths = new float[] { 4f, 1f, 1f };
            table.SetWidths(widths);
            PdfPCell cell = new PdfPCell();
            table.DefaultCell.Border = Rectangle.NO_BORDER; 
            cell.Colspan = 3;
            cell.HorizontalAlignment = 0; //0=Left, 1=Centre, 2=Right
            table.AddCell(cell);
            table.AddCell("FIRMA:");
            table.AddCell("TOTAL:");
            table.AddCell(total.ToString("F"));

            table.AddCell(" ");
            table.AddCell("IVA 21%:");
            table.AddCell((21 * total / 100).ToString("F"));

            table.AddCell(" ");
            table.AddCell("A PAGAR:");
            table.AddCell((total + (21 * total / 100)).ToString("F"));

            factura.Add(table);
        }

        public void ImprimirFactura()
        {
            string pdfFileToPrint  = "facturas\\" + objVentas.getNumFactura() + ".pdf";
            string adobeFolder  = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\Adobe";
            string[] acroFiles = Directory.GetFiles(adobeFolder, "AcroRd32.exe", SearchOption.AllDirectories);
            if (acroFiles.Length > 0)
            {
                string reader = acroFiles[0];
                Process ps = Process.Start(reader, "/N /P " + pdfFileToPrint);
            }
            else
            {                
                 MessageBox.Show("Para imprimir la factura debe tener instalado Adobe Reader.");
            }
        }

        private static void AddImageInCell(PdfPCell cell, iTextSharp.text.Image image, float fitWidth, float fitHight, int Alignment)
        {
            image.ScaleToFit(fitWidth, fitHight);
            image.Alignment = Alignment;
            cell.AddElement(image);
        }
        private void AddtextCell(PdfPTable table, PdfPCell cell)
        {
            cell.Colspan = 3;
            cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right
            cell.Border = 0;
            table.AddCell(cell);
        }
        private void AddtextCell(PdfPTable table, PdfPCell cell, float paddingLeft, float paddingRight)
        {
            cell.Colspan = 3;
            cell.HorizontalAlignment = 0; //0=Left, 1=Centre, 2=Right
            cell.PaddingLeft = paddingLeft;
            cell.PaddingRight = paddingRight;
            cell.Border = 0;
            table.AddCell(cell);
        }
        private void AddtextCell(PdfPTable table, PdfPCell cell, float paddingLeft, float paddingRight, int hAlign)
        {
            cell.Colspan = 3;
            cell.HorizontalAlignment = hAlign; //0=Left, 1=Centre, 2=Right
            cell.PaddingLeft = paddingLeft;
            cell.PaddingRight = paddingRight;
            cell.Border = 0;
            table.AddCell(cell);
        }
        private static void AddtextCell(PdfPTable table, PdfPCell cell, int Colspan, int HorizontalAlignment, int Border)
        {
            cell.Colspan = Colspan;
            cell.HorizontalAlignment = HorizontalAlignment; //0=Left, 1=Centre, 2=Right
            cell.Border = Border;
            table.AddCell(cell);
        }
    }
}
